package main 
import(
	"fmt"
)
func test(char byte) byte{
	return char +1
}

func main(){
	var key byte 
	fmt.Println("字符： a b c d")
	fmt.Scanf("%c",&key)

	switch key {
		case 'a' : 
			fmt.Println("a")
		case 'b' :
			fmt.Println("b")
		case 'c':
			fmt.Println("c")
		default:
			fmt.Println("error")
	}

	// 1) case/switch 后是一个表达式( 即：常量值、变量、一个有返回值的函数等都可以)
	switch test(key)+1{
	 	case 'a' : 
			fmt.Println("a")
		case 'b' :
			fmt.Println("b")
		case 'c':
			fmt.Println("c")
		default:
			fmt.Println("error")
	}

	// 2) case 后面可以带多个表达式，使用逗号间隔。比如 case 表达式 1, 表达式 2 ...
	// 3)case 后面的表达式如果是常量值(字面量)，则要求不能重复
	var n1 int32 = 5
	var n2 int32 = 20
	switch n1 {
		case n2 ,10 ,5 :
			fmt.Println("ok1")
		// case 5 : // 前面有 5， 编译会报错
			// fmt.Println("ok1")
		default:
			fmt.Println("error")
	}

	// 5) case 后面不需要带 break , 程序匹配到一个 case 后就会执行对应的代码块，然后退出 switch，如 果一个都匹配不到，则执行 default
	// 6) default 语句不是必须的.
	// 7) switch 后也可以不带表达式，类似 if --else 分支来使用。

	var age =10
	switch{
		case age == 10:
			fmt.Println("age ==10")
		case age == 20 :
			fmt.Println("age==20")
		default:
			fmt.Println("error")
		
	}

	switch{
		case age >20:
			fmt.Println("青年人")
		case age > 10 && age < 20:
			fmt.Println("少年")
		default:
			fmt.Println("error")
	}

	//8) switch 后也可以直接声明/定义一个变量，分号结束，不推荐。
	switch grade := 90;{
		case grade > 90:
			fmt.Println("good")
		case grade >=70 && grade <= 90:
			fmt.Println("nice")
		default:
			fmt.Println("error")
	}
	// 9) switch 穿透-fallthrough ，如果在 case 语句块后增加 fallthrough ,则会继续执行下一个 case，也 叫 switch 穿透
	var num int = 10
	switch num {
		case 10:
			fmt.Println("ok1")
			fallthrough // 默认只穿透一层
		case 20:
			fmt.Println("ok2")
			fallthrough
		case 30:
			fmt.Println("ok3")
		case 40:
			fmt.Println("ok4")
		default:
			fmt.Println("error")
	}

	// Type Switch：switch 语句还可以被用于 type-switch 
	// 来判断某个 interface 变量中实际指向的 变量类型 【还没有学 interface, 先体验一把】
	var x interface{}
	var y = 10.0
	x = y
	switch i := x.(type){
	case nil:
		fmt.Printf("x 的类型是: %T",i)
	case int :
		fmt.Printf("x 的类型 int ",i)
	case float64:
		fmt.Printf("x 的类型是: %T",i)
	case func(int) float64:
		fmt.Printf("x 的类型是: %T",i)
	case bool ,string:
		fmt.Printf("x 是 bool or string")
	default:
		fmt.Printf("未知")
	}
}
